/**
 * analytics.js - 用户行为跟踪模块
 * 
 * 用于收集用户在小程序中的行为数据，发送到服务器进行分析
 * 支持的事件类型：
 * - view: 浏览页面/课程
 * - click: 点击事件
 * - favorite: 收藏课程
 * - rate: 评分课程
 * - complete: 完成课程
 * - purchase: 购买课程
 */

const request = require('./request')

// 埋点数据缓存，用于批量发送，减少网络请求
let analyticsCache = []

// 配置项
const config = {
  // 是否启用埋点
  enabled: true,
  // 缓存阈值，达到该值时自动发送
  cacheThreshold: 10,
  // 自动发送间隔(ms)，即使未达到阈值也会定期发送
  autoSendInterval: 30000,
  // 埋点API地址
  apiUrl: '/api/weblog/track',
  // 开启调试模式，查看详细日志
  debug: true
}

// 定时器ID
let autoSendTimer = null

/**
 * 初始化埋点系统
 * @param {Object} options 自定义配置
 */
function init(options = {}) {
  // 合并配置
  Object.assign(config, options)
  
  // 设置自动发送定时器
  if (config.enabled && config.autoSendInterval > 0) {
    autoSendTimer = setInterval(() => {
      if (analyticsCache.length > 0) {
        sendTracking()
      }
    }, config.autoSendInterval)
  }
  
  // 添加小程序退出时发送缓存数据
  wx.onAppHide(() => {
    if (analyticsCache.length > 0) {
      sendTracking(true) // 强制立即发送
    }
  })
  
  if (config.debug) {
    console.log('[Analytics] 埋点系统初始化完成')
  }
}

/**
 * 记录用户行为
 * @param {String} eventType 事件类型：view/click/favorite/rate/complete/purchase
 * @param {Number} courseId 相关课程ID (可选)
 * @param {Object} extraData 额外数据 (可选)
 */
function track(eventType, courseId = null, extraData = {}) {
  if (!config.enabled) return
  
  // 获取当前用户ID，从全局app对象中获取
  const app = getApp();
  const userId = app && app.globalData && app.globalData.userInfo ? app.globalData.userInfo.id : null;
  
  if (!userId) {
    if (config.debug) {
      console.warn('[Analytics] 用户未登录，不记录埋点数据')
    }
    return
  }
  
  // 映射非标准事件类型到标准类型
  let normalizedEventType = eventType;
  
  // page_duration 事件映射为 view 类型
  if (eventType === 'page_duration') {
    normalizedEventType = 'view';
    
    // 将页面停留时间记录到额外数据中
    if (!extraData.duration && extraData.stay_duration) {
      extraData.duration = extraData.stay_duration;
    }
  }
  
  // 创建埋点数据
  const trackData = {
    user_id: userId,
    event_type: normalizedEventType,
    timestamp: new Date().toISOString(),
    extra_data: extraData
  }
  
  // 如果有课程ID，添加到数据中
  if (courseId) {
    trackData.course_id = courseId
  }
  
  // 添加到缓存
  analyticsCache.push(trackData)
  
  if (config.debug) {
    console.log('[Analytics] 记录事件:', trackData)
  }
  
  // 如果达到阈值，自动发送
  if (analyticsCache.length >= config.cacheThreshold) {
    sendTracking()
  }
}

/**
 * 发送埋点数据到服务器
 * @param {Boolean} immediate 是否立即发送，不考虑节流
 * @returns {Promise}
 */
function sendTracking(immediate = false) {
  if (analyticsCache.length === 0) return Promise.resolve()
  
  // 复制缓存数据并清空缓存
  const dataToSend = [...analyticsCache]
  analyticsCache = []
  
  if (config.debug) {
    console.log('[Analytics] 发送埋点数据:', dataToSend.length, '条')
  }
  
  // 获取设备信息
  const systemInfo = wx.getSystemInfoSync()
  
  // 发送数据到服务器
  return request({
    url: config.apiUrl,
    method: 'POST',
    data: {
      events: dataToSend,
      deviceInfo: {
        platform: systemInfo.platform,
        brand: systemInfo.brand,
        model: systemInfo.model,
        system: systemInfo.system,
        screenWidth: systemInfo.screenWidth,
        screenHeight: systemInfo.screenHeight,
        version: systemInfo.version,
        SDKVersion: systemInfo.SDKVersion
      }
    }
  }).catch(err => {
    if (config.debug) {
      console.error('[Analytics] 埋点数据发送失败:', err)
    }
    // 发送失败时将数据添加回缓存（除非是立即发送模式）
    if (!immediate) {
      analyticsCache = [...dataToSend, ...analyticsCache]
    }
  })
}

/**
 * 页面浏览事件快捷方法
 * @param {String} pageName 页面名称
 * @param {Object} pageParams 页面参数
 */
function pageView(pageName, pageParams = {}) {
  track('view', null, {
    page_name: pageName,
    page_params: pageParams
  })
}

/**
 * 课程浏览事件快捷方法
 * @param {Number} courseId 课程ID
 * @param {String} courseName 课程名称
 */
function courseView(courseId, courseName) {
  track('view', courseId, {
    course_name: courseName
  })
}

/**
 * 点击事件快捷方法
 * @param {String} elementId 元素ID或名称
 * @param {String} pageName 页面名称
 * @param {Number} courseId 相关的课程ID (可选)
 */
function clickEvent(elementId, pageName, courseId = null) {
  track('click', courseId, {
    element_id: elementId,
    page_name: pageName
  })
}

/**
 * 收藏课程事件
 * @param {Number} courseId 课程ID
 * @param {Boolean} isFavorite 是否收藏(true)或取消收藏(false)
 */
function favoriteCourse(courseId, isFavorite = true) {
  track('favorite', courseId, {
    is_favorite: isFavorite
  })
}

/**
 * 评分课程事件
 * @param {Number} courseId 课程ID
 * @param {Number} rating 评分(1-5)
 * @param {String} comment 评论内容(可选)
 */
function rateCourse(courseId, rating, comment = '') {
  track('rate', courseId, {
    rating: rating,
    comment: comment
  })
}

/**
 * 完成课程事件
 * @param {Number} courseId 课程ID
 * @param {Number} progress 进度百分比(0-100)
 */
function completeCourse(courseId, progress = 100) {
  track('complete', courseId, {
    progress: progress
  })
}

/**
 * 购买课程事件
 * @param {Number} courseId 课程ID
 * @param {Number} price 价格
 * @param {String} paymentMethod 支付方式
 */
function purchaseCourse(courseId, price, paymentMethod = 'wechat') {
  track('purchase', courseId, {
    price: price,
    payment_method: paymentMethod,
    purchase_time: new Date().toISOString()
  })
}

/**
 * 手动发送所有缓存的埋点数据
 * @returns {Promise}
 */
function flush() {
  return sendTracking(true)
}

module.exports = {
  init,
  track,
  pageView,
  courseView,
  clickEvent,
  favoriteCourse,
  rateCourse,
  completeCourse,
  purchaseCourse,
  flush
} 